import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wangxin
 * Date: 2024-08-12
 * Time: 20:42
 */
public class TCPEchoServer {
    private ServerSocket serverSocket = null;
    public TCPEchoServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("启动服务器！");
        while(true){
          Socket clientSocket =  serverSocket.accept();
          Thread t = new Thread(() -> {
              try {
                  processConnect(clientSocket);
              }catch (Exception e){
                throw new RuntimeException(e);
              }
          }) ;
          t.start();
        }
    }
//针对一个链接，提供处理逻辑
    private void processConnect(Socket clientSocket) throws IOException {
        //打印一下客户端信息
        System.out.printf("[%s:%d] 客户端上线！",clientSocket.getInetAddress(),clientSocket.getPort());
        try(InputStream inputStream = clientSocket.getInputStream();
            OutputStream outputStream = clientSocket.getOutputStream()){
            Scanner scanner = new Scanner(inputStream);
            PrintWriter printWriter = new PrintWriter(outputStream);
            while(true){
                //1.读取请求并解析
                if(!scanner.hasNext()){
                    System.out.printf("[%s:%d] 客户端下线！",clientSocket.getInetAddress(),clientSocket.getPort());
                    break;
                }
                String request = scanner.next();
                //2.根据请求计算响应
                String response = process(request);
                //3.把响应写回客户端
               printWriter.println(response);
               printWriter.flush();
               //打印日志
                System.out.printf("[%s:%d] req = %s,req = %s\n",clientSocket.getInetAddress(),clientSocket.getPort(),
                        request,response);
            }

        }
            catch(IOException e){
            e.printStackTrace();
        }
        finally {
            System.out.printf("[%s:%d] 客户端下线\n",clientSocket.getInetAddress(),clientSocket.getPort() );

            clientSocket.close();
        }
    }

    private String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        TCPEchoServer server = new TCPEchoServer(9090);
        server.start();
    }

}
